/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package utiles.datastructure;

/**
 * @author Ravi Mohan
 * @author Mike Stampone
 *
 */
public class Triplet<X, Y, Z> {
        private final X x;

        private final Y y;

        private final Z z;

        /**
         * Constructs a triplet with three specified elements.
         *
         * @param x
         *            the first element of the triplet.
         * @param y
         *            the second element of the triplet.
         * @param z
         *            the third element of the triplet.
         */
        public Triplet(X x, Y y, Z z) {//x = estado inicial, y = accion, z = estado final
                this.x = x;
                this.y = y;
                this.z = z;
        }

        /**
         * Returns the first element of the triplet.
         *
         * @return the first element of the triplet.
         */
        public X getFirst() {
                return x;
        }

        /**
         * Returns the second element of the triplet.
         *
         * @return the second element of the triplet.
         */
        public Y getSecond() {
                return y;
        }

        /**
         * Returns the third element of the triplet.
         *
         * @return the third element of the triplet.
         */
        public Z getThird() {
                return z;
        }

        @Override
        public boolean equals(Object o) {
                if (o instanceof Triplet<?, ?, ?>) {
                        Triplet<?, ?, ?> other = (Triplet<?, ?, ?>) o;
                        return (x.equals(other.x)) && (y.equals(other.y))
                                        && (z.equals(other.z));
                }
                return false;
        }

        @Override
        public int hashCode() {
                return x.hashCode() + 31 * y.hashCode() + 31 * z.hashCode();
        }

        @Override
        public String toString() {
                return "< " + x.toString() + " , " + y.toString() + " , "
                                + z.toString() + " >";
        }
}